parser grammar CParser;

options {
    tokenVocab = BasicLexer;
}

@parser::header {
    package pl.CLexer;
}

@parser::members {

  List<RecognitionException> errors = new ArrayList<RecognitionException>();

  public List<RecognitionException> getAllErrors() {
      return new ArrayList<RecognitionException>(errors);
  }
 
  public boolean hasErrors() {
      return !errors.isEmpty();
  }
  
  @Override
  public void reportError(RecognitionException e) {
      displayRecognitionError(this.getTokenNames(), e);
      errors.add(e);
  }
  
}


// Analizador Sintactico
entrada: instrucciones EOF;
instrucciones: instruccion*;
instruccion: exp PUNTO_COMA;
exp: exp_mult (operador_arit exp_mult)*;
exp_mult: exp_base (operador_geo exp_base)*;
exp_base: numero | PARENTESIS_ABIERTO exp PARENTESIS_CERRADO;

numero: REAL | INTEGER;
operador_arit: MAS | MENOS;
operador_geo: DIVISION | MULTIPLICACION;
